package com.moyuaninfo.myyserver.framework.exception;

import com.moyuaninfo.myyserver.framework.enums.JsonResultEnum;
import com.moyuaninfo.myyserver.framework.json.JsonResult;
import com.moyuaninfo.myyserver.framework.utils.JsonResultUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * 统一异常处理
 *
 * @author 祥霸
 * @date 2020/03/20
 */
@RestControllerAdvice
public class ExceptionHandler {

    /**
     * <p> 请求参数校验统一处理</p>
     *
     * @param e: 异常类
     * @return com.example.springboot.biz.json.JsonResult
     *
     * @author 祥霸
     * @date 15:06 2019/8/23
     */
    @org.springframework.web.bind.annotation.ExceptionHandler({BindException.class, MethodArgumentNotValidException.class})
    public JsonResult handleMethodArgumentNotValidException(Exception e){
        // 错误信息
        String errorMsg;

        // 错误信息对象列表
        List<ObjectError> list;
        if (e instanceof BindException) {
            list = ((BindException)e).getAllErrors();
        } else {
            list = ((MethodArgumentNotValidException)e).getBindingResult().getAllErrors();
        }

        // 错误信息对象
        ObjectError objectError = list.get(0);
        errorMsg = objectError.getDefaultMessage();

        // 返回错误信息
        return JsonResultUtils.fail(null, errorMsg);
    }

    /**
     * <p> 统一异常处理</p>
     *
     * @param e: 异常类
     * @return com.example.springboot.biz.json.JsonResult
     *
     * @author 祥霸
     * @date 11:23 2019/8/21
     */
    @org.springframework.web.bind.annotation.ExceptionHandler(IllegalArgumentException.class)
    public JsonResult illegalArgumentExceptionHandler(Exception e){
        e.printStackTrace();
        return JsonResultUtils.make(null, JsonResultEnum.UNAUTHORIZED);
    }

    /**
     * <p> 统一异常处理</p>
     *
     * @param e: 异常类
     * @return com.example.springboot.biz.json.JsonResult
     *
     * @author 祥霸
     * @date 11:23 2019/8/21
     */
    @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
    public JsonResult exceptionHandler(Exception e){
        e.printStackTrace();
        return JsonResultUtils.make(null, JsonResultEnum.INTERNAL_SERVER_ERROR);
    }
}
